Fixed minimum increment calculation of GailScaleButton.
authorSzilárd Pfeiffer <mailbox@pfeifferszilard.hu>
Mon, 30 Aug 2010 18:15:09 +0000 (20:15 +0200)
committerJavier Jardón <jjardon@gnome.org>
Mon, 30 Aug 2010 20:39:11 +0000 (22:39 +0200)
Also implemented to use the adjustment to determine the current, minimum,
maximum values and mimimum increment just as the other widgets which have
adjustment.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=626710

modules/other/gail/gailscalebutton.c
modules/other/gail/gailscalebutton.h

index 9f2130e39f19699ee896bcacb974f1ef61d1e14d..820d767439bc09a5ed8ab0169d87978791314277 100644 (file)
@@ -30,12 +30,12 @@ static void gail_scale_button_class_init (GailScaleButtonClass *klass);
 static void gail_scale_button_init       (GailScaleButton      *button);
 
 /* GailWidget */
-static void gail_scale_button_notify_gtk (GObject    *obj,
-                                          GParamSpec *pspec);
+static void gail_scale_button_real_notify_gtk (GObject    *obj,
+                                               GParamSpec *pspec);
 
 /* AtkObject */
-static void gail_scale_button_initialize (AtkObject *obj,
-                                          gpointer   data);
+static void gail_scale_button_real_initialize (AtkObject *obj,
+                                               gpointer   data);
 
 /* AtkAction */
 static void                  atk_action_interface_init        (AtkActionIface *iface);
@@ -64,6 +64,8 @@ static void   gail_scale_button_get_minimum_increment (AtkValue       *obj,
                                                          GValue         *value);
 static gboolean        gail_scale_button_set_current_value     (AtkValue       *obj,
                                                          const GValue   *value);
+static void     gail_scale_button_value_changed         (GtkAdjustment  *adjustment,
+                                                         gpointer       data);
 
 G_DEFINE_TYPE_WITH_CODE (GailScaleButton, gail_scale_button, GAIL_TYPE_BUTTON,
                          G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
@@ -75,9 +77,9 @@ gail_scale_button_class_init (GailScaleButtonClass *klass)
   AtkObjectClass *atk_object_class = ATK_OBJECT_CLASS (klass);
   GailWidgetClass *widget_class = GAIL_WIDGET_CLASS (klass);
 
-  atk_object_class->initialize = gail_scale_button_initialize;
+  atk_object_class->initialize = gail_scale_button_real_initialize;
 
-  widget_class->notify_gtk = gail_scale_button_notify_gtk;
+  widget_class->notify_gtk = gail_scale_button_real_notify_gtk;
 }
 
 static void
@@ -86,11 +88,32 @@ gail_scale_button_init (GailScaleButton *button)
 }
 
 static void
-gail_scale_button_initialize (AtkObject *obj,
-                              gpointer   data)
+gail_scale_button_real_initialize (AtkObject *obj,
+                                   gpointer  data)
 {
+  GailScaleButton *scale_button = GAIL_SCALE_BUTTON (obj);
+  GtkScaleButton *gtk_scale_button;
+  GtkAdjustment *gtk_adjustment;
+
   ATK_OBJECT_CLASS (gail_scale_button_parent_class)->initialize (obj, data);
 
+  gtk_scale_button = GTK_SCALE_BUTTON (data);
+  gtk_adjustment = gtk_scale_button_get_adjustment (gtk_scale_button);
+  /*
+   * If a GtkAdjustment already exists for the scale_button,
+   * create the GailAdjustment
+   */
+  if (gtk_adjustment)
+    {
+      scale_button->adjustment = gail_adjustment_new (gtk_adjustment);
+      g_signal_connect (gtk_adjustment,
+                        "value-changed",
+                        G_CALLBACK (gail_scale_button_value_changed),
+                        obj);
+    }
+  else
+    scale_button->adjustment = NULL;
+
   obj->role = ATK_ROLE_SLIDER;
 }
 
@@ -187,96 +210,95 @@ static void
 gail_scale_button_get_current_value (AtkValue *obj,
                                      GValue   *value)
 {
-  GtkScaleButton *gtk_scale_button;
+  GailScaleButton *scale_button;
 
   g_return_if_fail (GAIL_IS_SCALE_BUTTON (obj));
 
-  gtk_scale_button = GTK_SCALE_BUTTON (gtk_accessible_get_widget (GTK_ACCESSIBLE (obj)));
+  scale_button = GAIL_SCALE_BUTTON (obj);
+  if (scale_button->adjustment == NULL)
+    /*
+     * Adjustment has not been specified
+     */
+    return;
 
-  g_value_set_double (g_value_init (value, G_TYPE_DOUBLE),
-                      gtk_scale_button_get_value (gtk_scale_button));
+  atk_value_get_current_value (ATK_VALUE (scale_button->adjustment), value);
 }
 
 static void
 gail_scale_button_get_maximum_value (AtkValue *obj,
                                      GValue   *value)
 {
-  GtkWidget *gtk_widget;
-  GtkAdjustment *adj;
+  GailScaleButton *scale_button;
 
   g_return_if_fail (GAIL_IS_SCALE_BUTTON (obj));
 
-  gtk_widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
-  if (gtk_widget == NULL)
+  scale_button = GAIL_SCALE_BUTTON (obj);
+  if (scale_button->adjustment == NULL)
+    /*
+     * Adjustment has not been specified
+     */
     return;
 
-  adj = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (gtk_widget));
-  if (adj != NULL)
-    g_value_set_double (g_value_init (value, G_TYPE_DOUBLE),
-                        adj->upper);
+  atk_value_get_maximum_value (ATK_VALUE (scale_button->adjustment), value);
 }
 
 static void
 gail_scale_button_get_minimum_value (AtkValue *obj,
                                      GValue   *value)
 {
-  GtkWidget *gtk_widget;
-  GtkAdjustment *adj;
+  GailScaleButton *scale_button;
 
   g_return_if_fail (GAIL_IS_SCALE_BUTTON (obj));
 
-  gtk_widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
-  if (gtk_widget == NULL)
+  scale_button = GAIL_SCALE_BUTTON (obj);
+  if (scale_button->adjustment == NULL)
+    /*
+     * Adjustment has not been specified
+     */
     return;
 
-  adj = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (gtk_widget));
-  if (adj != NULL)
-    g_value_set_double (g_value_init (value, G_TYPE_DOUBLE),
-                        adj->lower);
+  atk_value_get_minimum_value (ATK_VALUE (scale_button->adjustment), value);
 }
 
 static void
 gail_scale_button_get_minimum_increment (AtkValue *obj,
                                          GValue   *value)
 {
-  GtkWidget *gtk_widget;
-  GtkAdjustment *adj;
+  GailScaleButton *scale_button;
 
   g_return_if_fail (GAIL_IS_SCALE_BUTTON (obj));
 
-  gtk_widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
-  if (gtk_widget == NULL)
+  scale_button = GAIL_SCALE_BUTTON (obj);
+  if (scale_button->adjustment == NULL)
+    /*
+     * Adjustment has not been specified
+     */
     return;
 
-  adj = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (gtk_widget));
-  if (adj != NULL)
-    g_value_set_double (g_value_init (value, G_TYPE_DOUBLE),
-                        adj->step_increment);
+  atk_value_get_minimum_increment (ATK_VALUE (scale_button->adjustment), value);
 }
 
 static gboolean
 gail_scale_button_set_current_value (AtkValue     *obj,
                                      const GValue *value)
 {
-  GtkWidget *gtk_widget;
+  GailScaleButton *scale_button;
 
   g_return_val_if_fail (GAIL_IS_SCALE_BUTTON (obj), FALSE);
 
-  gtk_widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
-  if (gtk_widget == NULL)
+  scale_button = GAIL_SCALE_BUTTON (obj);
+  if (scale_button->adjustment == NULL)
+    /*
+     * Adjustment has not been specified
+     */
     return FALSE;
 
-  if (G_VALUE_HOLDS_DOUBLE (value))
-    {
-      gtk_scale_button_set_value (GTK_SCALE_BUTTON (gtk_widget), g_value_get_double (value));
-      return TRUE;
-    }
-  return FALSE;
+  return atk_value_set_current_value (ATK_VALUE (scale_button->adjustment), value);
 }
 
 static void
-gail_scale_button_notify_gtk (GObject    *obj,
-                              GParamSpec *pspec)
+gail_scale_button_real_notify_gtk (GObject    *obj,
+                                   GParamSpec *pspec)
 {
   GtkScaleButton *gtk_scale_button;
   GailScaleButton *scale_button;
@@ -286,9 +308,29 @@ gail_scale_button_notify_gtk (GObject    *obj,
   gtk_scale_button = GTK_SCALE_BUTTON (obj);
   scale_button = GAIL_SCALE_BUTTON (gtk_widget_get_accessible (GTK_WIDGET (gtk_scale_button)));
 
-  if (strcmp (pspec->name, "value") == 0)
+  if (strcmp (pspec->name, "adjustment") == 0)
     {
-      g_object_notify (G_OBJECT (scale_button), "accessible-value");
+      /*
+       * Get rid of the GailAdjustment for the GtkAdjustment
+       * which was associated with the scale_button.
+       */
+      GtkAdjustment* gtk_adjustment;
+
+      if (scale_button->adjustment)
+        {
+          g_object_unref (scale_button->adjustment);
+          scale_button->adjustment = NULL;
+        }
+      /*
+       * Create the GailAdjustment when notify for "adjustment" property
+       * is received
+       */
+      gtk_adjustment = gtk_scale_button_get_adjustment (gtk_scale_button);
+      scale_button->adjustment = gail_adjustment_new (gtk_adjustment);
+      g_signal_connect (gtk_adjustment,
+                        "value-changed",
+                        G_CALLBACK (gail_scale_button_value_changed),
+                        scale_button);
     }
   else
     {
@@ -296,4 +338,17 @@ gail_scale_button_notify_gtk (GObject    *obj,
     }
 }
 
+static void
+gail_scale_button_value_changed (GtkAdjustment    *adjustment,
+                                 gpointer         data)
+{
+  GailScaleButton *scale_button;
+
+  gail_return_if_fail (adjustment != NULL);
+  gail_return_if_fail (data != NULL);
+
+  scale_button = GAIL_SCALE_BUTTON (data);
+
+  g_object_notify (G_OBJECT (scale_button), "accessible-value");
+}
 
index d0ec87879962f283f2e6f81af5ea463a00d38472..ce79b47c68f1bc01e03ade295462b12be5b902bb 100644 (file)
@@ -38,6 +38,8 @@ typedef struct _GailScaleButtonClass              GailScaleButtonClass;
 struct _GailScaleButton
 {
   GailButton parent;
+
+  AtkObject *adjustment;
 };
 
 struct _GailScaleButtonClass